package cn.iocoder.yudao.module.cms.qlink.service;

import cn.iocoder.yudao.framework.business.basic.dao.query.CoreLambdaQueryWrapper;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.cms.qlink.bo.QlinkIdentifyBO;
import cn.iocoder.yudao.module.cms.qlink.dal.dataobject.QlinkDO;
import cn.iocoder.yudao.module.cms.qlink.dal.mysql.QlinkMapper;
import cn.iocoder.yudao.module.cms.qlink.vo.AdminQlinkPageReqVO;
import cn.iocoder.yudao.module.cms.qlink.vo.AdminQlinkSaveReqVO;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import java.util.ArrayList;
import java.util.List;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.api.cms.ErrorCodeConstants.QLINK_NOT_EXISTS;

/**
 * 快捷链接 Service 实现类
 *
 * @author 山野羡民（1032694760@qq.com）
 */
@Service
@Validated
public class QlinkServiceImpl implements QlinkService {

    @Resource
    private QlinkMapper qlinkMapper;

    @Override
    public Long createQlink(AdminQlinkSaveReqVO createReqVO) {
        // 插入
        QlinkDO ad = BeanUtils.toBean(createReqVO, QlinkDO.class);
        qlinkMapper.insert(ad);
        // 返回
        return ad.getId();
    }

    @Override
    public void updateQlink(AdminQlinkSaveReqVO updateReqVO) {
        // 校验存在
        validateQlinkExists(updateReqVO.getId());
        // 更新
        QlinkDO qlinkDO = BeanUtils.toBean(updateReqVO, QlinkDO.class);
        qlinkMapper.updateById(qlinkDO);
    }

    @Override
    public void deleteQlink(Long id) {
        // 校验存在
        QlinkDO qlinkDO = validateQlinkExists(id);
        // 删除
        qlinkMapper.deleteById(qlinkDO);
    }

    private QlinkDO validateQlinkExists(Long id) {
        QlinkDO qlinkDO = qlinkMapper.selectById(id);
        if (qlinkDO == null) {
            throw exception(QLINK_NOT_EXISTS);
        }
        return qlinkDO;
    }

    @Override
    public QlinkDO getQlinkById(Long id) {
        return qlinkMapper.selectById(id);
    }

    @Override
    public List<QlinkDO> getQlinkByIdentify(String identify) {
        return qlinkMapper.selectList(new CoreLambdaQueryWrapper<QlinkDO>()
                .eq(QlinkDO::getIdentify, identify)
                .eq(QlinkDO::getStatus, CommonStatusEnum.ENABLE.getStatus())
                .orderByAsc(QlinkDO::getSort)
                .orderByDesc(QlinkDO::getCreateTime));
    }

    @Override
    public PageResult<QlinkDO> getQlinkPage(AdminQlinkPageReqVO pageReqVO) {
        return qlinkMapper.selectPage(pageReqVO);
    }

    @Override
    public List<QlinkIdentifyBO> getAllIdentify() {
        return qlinkMapper.selectAllIdentify();
    }

    @Override
    public List<QlinkDO> getQlinkAll(String identify) {
        return qlinkMapper.selectList(new CoreLambdaQueryWrapper<QlinkDO>()
                .eq(QlinkDO::getIdentify, identify)
                .eq(QlinkDO::getStatus, CommonStatusEnum.ENABLE.getStatus())
                .orderByAsc(QlinkDO::getSort)
                .orderByDesc(QlinkDO::getCreateTime));
    }

    @Override
    public List<QlinkDO> getQlinkTopList(String identify, Integer limit) {
        if (limit == null || limit <= 0) {
            return new ArrayList<>();
        }
        CoreLambdaQueryWrapper<QlinkDO> wrapper = new CoreLambdaQueryWrapper<>();
        wrapper.eq(QlinkDO::getIdentify, identify);
        wrapper.eq(QlinkDO::getStatus, CommonStatusEnum.ENABLE.getStatus());
        wrapper.orderByAsc(QlinkDO::getSort);
        wrapper.orderByDesc(QlinkDO::getCreateTime);
        wrapper.limitN(limit);
        return qlinkMapper.selectList(wrapper);
    }

}
